
(function () {
    var nvs = {};

	/// 播放状态
    nvs.PlayerState = new function () {
        this.kStopped = 0;	/// 停止
        this.kPaused = 1;	/// 暂停
        this.kPlaying = 2;	/// 播放中
    };
	
	/// 播放类型
    nvs.PlayerType = new function () {
        this.kLivePlayer = 0;		/// 实时预览
        this.kRecordPlayer = 1;		/// 录像回放
        this.kFilePlayer = 2;		/// 文件回放
    };
	
	/// 录像类型
    nvs.RecordType = new function () {
        this.kNone = 0;
        this.kSystemRecord = 0x01;
        this.kFrontRecord  = 0x02;
        this.kManualRecord = 0x04;
        this.kAlarmRecord  = 0x08;
    };
	
	/// 上下线状态
    nvs.StatusType = new function () {
        this.kOffline = 0;	/// 下线
        this.kOnline = 1;	/// 上线
		};
		
		nvs.EventType = new function () {
			this.MDECODE_EVENT_OPENING = 256;	/// 打开文件中.
			this.MDECODE_EVENT_OPEN_FAILED = 257;		/// 打开失败.
			this.MDECODE_EVENT_OPENED = 258;			/// 打开成功.
			this.MDECODE_EVENT_CLOSED = 259;			/// 文件关闭.

			this.MDECODE_EVENT_END  = 260;		/// 播放结束.

			this.MDECODE_EVENT_FORMAT_READY = 261;	/// 已知媒体格式.

			this.MDECODE_EVENT_SEEKING = 262;	/// 拖拽中.
			this.MDECODE_EVENT_SEEKED = 263;		/// 拖拽完成.

			this.MDECODE_EVENT_FULLSCREEN = 264;	/// 全屏变化.
			this.MDECODE_EVENT_VOLUME = 265;		/// 音量变化.
			this.MDECODE_EVENT_MUTE = 266;		/// 静音变化.
			this.MDECODE_EVENT_SCALE = 267;		/// 播放速度变化.

			this.MDECODE_EVENT_PLAYING= 268;		/// 播放中.
			this.MDECODE_EVENT_PAUSED = 269;			/// 暂停.
			this.MDECODE_EVENT_STOPPED = 270;		/// 停止播放.

			this.MDECODE_EVENT_MOUSE_DOWN = 4096;	/// 鼠标单击, 事件参数值是 int64_t, 低32位是x坐标, 高位是y坐标
			this.MDECODE_EVENT_MOUSE_UP = 4097;				/// 鼠标抬起
			this.MDECODE_EVENT_MOUSE_DOUBLE_DOWN = 4098;	/// 鼠标双击
			this.MDECODE_EVENT_MOUSE_ENTER = 4099;		/// 鼠标进入.
			this.MDECODE_EVENT_MOUSE_LEAVE = 4050;		/// 鼠标离开.

			this.MDECODE_EVENT_RETRY = 8192;
			this.MDECODE_EVENT_FIRST_VIDEO_FRAME = 8193;
		}

	/// PTZ命令
    nvs.PTZCommand = new function () {
		this.PTZ_CMD_START = 0;
		this.PTZ_CMD_STOP = 1;		///停止	

		this.PTZ_CMD_RIGHT = 2;		///右	
		this.PTZ_CMD_LEFT = 4;		///左
		this.PTZ_CMD_DOWN = 6;		/// 下
		this.PTZ_CMD_UP = 8;		/// 上

		this.PTZ_CMD_RIGHT_UP    = 22;	//右上
		this.PTZ_CMD_LEFT_UP     = 24;	//左上
		this.PTZ_CMD_RIGHT_DOWN  = 26;	//右下
		this.PTZ_CMD_LEFT_DOWN   = 28;	//左下
	
		this.PTZ_CMD_SMALL = 10;	///光圈变小
		this.PTZ_CMD_LARGE = 12;	///光圈变大

		this.PTZ_CMD_ZOOM_IN = 14;	///焦距变大
		this.PTZ_CMD_ZOOM_OUT = 16;	///焦距变小

		this.PTZ_CMD_FOCUS_IN = 18;		///焦点前调	
		this.PTZ_CMD_FOCUS_OUT = 20;	///焦点后调

		this.PTZ_CMD_ASSIST_FUNC_1 = 30;	///雨刷
		this.PTZ_CMD_ASSIST_FUNC_2 = 32;
		this.PTZ_CMD_ASSIST_FUNC_3 = 34;
		this.PTZ_CMD_ASSIST_FUNC_4 = 36;

		this.PTZ_RIGHT_APPLY = 40;		///权限申请
		this.PTZ_RIGHT_RELEASE = 42;	///权限释放

		this.PTZ_PRESET_ADD = 110;		///添加预置位
		this.PTZ_PRESET_MODIDY = 112;	///修改预置位
		this.PTZ_PRESET_DELETE = 114;	///删除预置位
		this.PTZ_PRESET_GOTO = 116;		///转到预置位	

		this.PTZ_CMD_SCAN = 120;		///自动扫描开 
		this.PTZ_CMD_LENGTH = 121;
    };
	
	/// 预置位标识
    nvs.PresetFlag = new function () {
        this.kNormal = 0;		///普通预置位
        this.kDay = 1;			///白天守望位
        this.kNight = 2;		///夜晚守望位  
    };
	
	nvs.DrawGraphMode = new function () {
        this.kDrawNone = 0;		///禁止绘图
        this.kDrawRect = 1;			///绘制矩形
        this.kDrawPolygon = 2;		///绘制多边形
	};

	nvs.isHostMethod = function(object, property){
		var t = typeof object[property];
		return t == 'function' ||
			(!!(t == 'object' && object[property])) ||
			t == 'unknown';
	}
	
	nvs.checkOcx = function (obj) {
		if (!obj) {
			return false;
		}
		return this.isHostMethod(obj, "Login");
	}

	/**
	 * 设置背景颜色
	 * @param {*} ocx 
	 * @param {int} color 
	 */
	nvs.SetBackColor = function (ocx, color) {
		return ocx.SetBackColor(color)
	}
	
	/**
	 * 登录
	 * @param {*} ocx 
	 * @param {string} ip 		服务器IP
	 * @param {int} port 		服务器端口
	 * @param {string} username 	用户名
	 * @param {string} password 	用户密码
	 */
	nvs.Login = function (ocx, ip, port, username, password) {
		return ocx.Login(ip, port, username, password)
	}
	
	/**
	 * 登出
	 * @param {*} ocx 
	 */
	nvs.Logout = function (ocx) {
		ocx.Logout()
	}

	/**
	 * 是否登录成功
	 * @param {*} ocx 
	 */
	nvs.IsLogin = function (ocx) {
		return ocx.IsLogin()
	}

	/**
	 * 设置参数
	 * @param {*} ocx 
	 * @param {string} name 
	 * @param {string} value 
	 */
	nvs.SetParam = function (ocx, name, value) {
		return ocx.SetParam(name, value)
	}

	/**
	 * 控制云镜
	 * @param {*} ocx 
	 * @param {string} devID		设备ID 
	 * @param {int} cmd 		控制命令, @see PTZCommand
	 * @param {int} speed 		控制速度, 取值为: [1,64]
	 * @param {int} data 		附加数据, 默认为0. 预置位操作时, 是预置位ID
	 */
	nvs.ControlPtz = function (ocx, devID, cmd, speed, data) {
		return ocx.ControlPtz(devID, cmd, speed, data)
	}
	
	/**
	 * 打开实时预览
	 * @param {*} ocx 
	 * @param {*} devID 	设备ID
	 */
	nvs.OpenLive = function (ocx, devID) {
		return ocx.OpenLive(devID)
	}

	/**
	 * 打开录像
	 * @param {*} ocx 
	 * @param {string} devID 	设备ID
	 * @param {long} tmBegin 	开始时间, unix EPOC时间, 秒级
	 * @param {long} tmEnd 		结束时间
	 * @param {int} place 		录像位置, 取值为 0
	 * @param {int} type 		录像类型, 暂无用
	 * @param {string} recID 	录像ID, 暂无用
	 */
	nvs.OpenRecord = function (ocx, devID, tmBegin, tmEnd, place, type, recID) {
		return ocx.OpenRecord(devID, tmBegin, tmEnd, place, type, recID)
	}
	
	/**
	 * 打开文件或者网络流
	 * @param {*} ocx 
	 * @param {string} url 	文件路径或者网络流URL
	 * @param {string} params 	附件参数, 默认为空
	 */
	nvs.OpenFile = function (ocx, url, params) {
		return ocx.OpenFile(url, params)
	}
	
	/**
	 * 播放
	 * @param {*} ocx 
	 */
	nvs.Play = function (ocx) {
		return ocx.Play()
	}

	/**
	 * 暂停/恢复
	 * @param {*} ocx 
	 * @param {bool} toPause 是否要暂停. true 表示暂停, false 表示恢复播放
	 */
	nvs.Pause = function (ocx, toPause) {
		return ocx.Pause(toPause)
	}

	/**
	 * 停止
	 * @param {*} ocx 
	 */
	nvs.Stop = function (ocx) {
		return ocx.Stop()
	}
	
	/**
	 * 拖拽定位
	 * @param {*} ocx 
	 * @param {long} pts 	时间戳, 单位为毫秒
	 */
	nvs.Seek = function (ocx, pts) {
		return ocx.Seek(pts)
	}
	
	/**
	 * 获取当前播放时间, 单位为毫秒
	 * @param {*} ocx 
	 */
	nvs.GetTime = function (ocx) {
		return ocx.GetTime()
	}

	/**
	 * 获取媒体时长, 单位为毫秒
	 * @param {*} ocx 
	 */
	nvs.GetDuration = function (ocx) {
		return ocx.GetDuration()
	}

	/**
	 * 设置播放倍速
	 * @param {*} ocx 
	 * @param {double} scale 倍速, 取值范围为: [1/8, 8]
	 */
	nvs.SetScale = function (ocx, scale) {
		return ocx.SetScale(scale)
	}
	
	/**
	 * 抓图
	 * @param {*} ocx 
	 * @param {*} filepath 文件路径
	 */
	nvs.Snap = function (ocx, filepath) {
		return ocx.Snap(filepath)
	}

	/**
	 * 设置视频显示比例.
	 * cx, cy < 0 表示填充整个窗口, cx=0,cy=0表示安装视频宽高显示.
	 * @param {*} ocx 
	 * @param {int} cx 	宽度
	 * @param {int} cy 	高度
	 */
	nvs.SetRatio = function (ocx, cx, cy) {
		return ocx.SetRatio(cx, cy)
	}
	
	/**
	 * 打开声音
	 * @param {*} ocx 
	 */
	nvs.OpenSound = function (ocx) {
		return ocx.OpenSound()
	}
	
	/**
	 * 关闭声音
	 * @param {*} ocx 
	 */
	nvs.CloseSound = function (ocx) {
		return ocx.CloseSound()
	}
	
	/**
	 * 切换声音开关. 如果原先是关闭的, 则打开; 否则关闭.
	 * @param {*} ocx 
	 */
	nvs.ToggleSound = function (ocx) {
		return ocx.ToggleSound()
	}

	/**
	 * 获取音量, 取值范围为 [0,100]
	 * @param {*} ocx 
	 */
	nvs.GetVolume = function (ocx) {
		return ocx.GetVolume()
	}

	/**
	 * 设置音量, 取值范围为 [0,100]
	 * @param {*} ocx 
	 * @param {int} volume 
	 */
	nvs.SetVolume = function (ocx, volume) {
		return ocx.SetVolume(volume)
	}

	/**
	 * 获取播放位置, 取值范围为: [0.0, 1.0]
	 * @param {*} ocx 
	 */
	nvs.GetPos = function (ocx) {
		return ocx.GetPos()
	}

	/**
	 * 拖拽定位
	 * @param {*} ocx 
	 * @param {double} pos 播放位置, 取值范围为: [0.0, 1.0]
	 */
	nvs.SetPos = function (ocx, pos) {
		return ocx.SetPos(pos)
	}

	/**
	 * 获取视频原始宽度
	 * @param {*} ocx 
	 */
	nvs.GetPictureWidth = function (ocx) {
		return ocx.GetPictureWidth()
	}

	/**
	 * 获取视频原始高度
	 * @param {*} ocx 
	 */
	nvs.GetPictureHeight = function (ocx) {
		return ocx.GetPictureHeight()
	}

	/**
	 * 运行/禁止显示轨迹
	 * @param {*} ocx 
	 * @param {bool} enabled 
	 */
	nvs.EnableDrawTrack = function (ocx, enabled) {
		return ocx.EnableDrawTrack(enabled)
	}

	/**
	 * 设置事件回调.
	 * OnEndOfStream 事件, 表示播放流结束. 原型: function OnEndOfStream(state) {}, 其中, state 暂无用.
	 * OnEndOfDownload 事件, 表示下载结束, 原型: function OnEndOfDownload(handle) {}, 其中, handle 是下载句柄.
	 * @param {*} ocx 
	 * @param {*} name 	事件名称
	 * @param {*} func 
	 */
	nvs.BindEvent = function (ocx, name, func) {
		return ocx.BindEvent(name, func)
	} 
	
	/**
	 * 取消事件回调
	 * @param {*} ocx 
	 * @param {*} name 
	 */
	nvs.UnbindEvent = function (ocx, name) {
		return ocx.UnbindEvent(name)
	}

	/**
	 * 取消所有事件回调
	 * @param {*} ocx 
	 */
	nvs.UnbindEvents = function (ocx) {
		return ocx.UnbindEvents()
	}

	/**
	 * 启用硬件解码
	 * @param {*} ocx 
	 * @param {*} enabled 是否启用, true 表示启用
	 */
	nvs.EnableHwAccel = function (ocx, enabled) {
		ocx.EnableHwAccel(enabled)
	}

	/**
	 * 设置人脸轨迹显示时长, 单位为毫秒
	 * @param {*} ocx 
	 * @param {*} duration 显示时长
	 */
	nvs.SetFaceTrackDuration = function (ocx, duration) {
		return ocx.SetFaceTrackDuration(duration)
	}

	/**
	 * 配置默认延时, 单位为毫秒. 对所有后续打开的实时播放, 都有影响.
	 * @param {*} ocx 
	 * @param {*} delayTime 延时
	 */
	nvs.SetDefDelayTime = function (ocx, delayTime) {
		return ocx.SetDefDelayTime(delayTime)
	}

	/**
	 * 设置当前播放器的延时, 仅对实时流有效.
	 * @param {*} ocx 
	 * @param {*} delayTime 延时
	 */
	nvs.SetDelayTime = function (ocx, delayTime) {
		return ocx.SetDelayTime(delayTime)
	}

	
	/**
	 * 下载录像
	 * @param {*} ocx 
	 * @param {string} devID 	设备ID
	 * @param {long} tmBegin 	开始时间, unix EPOC时间, 秒级
	 * @param {long} tmEnd 		结束时间
	 * @param {int} place 		录像位置, 取值为 0
	 * @param {int} type 		录像类型, 暂无用
	 * @param {string} recID 	录像ID, 暂无用
	 * @return 下载句柄
	 */
	nvs.StartDownload = function (ocx, filepath, devID, tmBegin, tmEnd, place, type, recID) {
		return ocx.StartDownload(filepath, devID, tmBegin, tmEnd, place, type, recID)
	}
	
	/**
	 * 停止/结束下载录像
	 * @param {*} ocx 
	 * @param {int} handle 下载句柄
	 */
	nvs.StopDownload = function (ocx, handle) {
		return ocx.StopDownload(handle)
	}
	
	/**
	 * 获取下载字节数
	 * @param {*} ocx 
	 * @param {int} handle 下载句柄
	 * @return 下载字节数
	 */
	nvs.GetDownloadBytes = function (ocx, handle) {
		return ocx.GetDownloadBytes()
	}
	
	/**
	 * 获取下载时间戳
	 * @param {*} ocx 
	 * @param {int} handle 下载句柄
	 * @return 流当前的时间戳
	 */
	nvs.GetDownloadTime = function (ocx, handle) {
		return ocx.GetDownloadTime()
	}
	
	/**
	 * 启用/禁止绘图
	 * @param {*} ocx 
	 * @param {*} mode 绘图模式 @see DrawGraphMode
	 */
	nvs.EnableDrawGraph = function (ocx, mode) {
		return ocx.EnableDrawGraph(mode)
	}
	
	/**
	 * 加载绘图, text 为JSON格式字符串
	 * @param {*} ocx 
	 * @param {*} text 
	 */
	nvs.SetDrawGraph = function (ocx, text) {
		return ocx.SetDrawGraph(text)
	}
	
	/**
	 * 获取绘图结果, JSON字符串形式.
	 * @param {*} ocx 
	 */
	nvs.GetDrawGraph = function (ocx) {
		return ocx.GetDrawGraph()
	}
	
	/**
	 * 删除指定绘图.
	 * @param {*} ocx 
	 * @param {*} mode 绘图模式 @see DrawGraphMode, 取值为 kDrawNone 时表示删除所有
	 */
	nvs.RemoveDrawGraph = function (ocx, mode) {
		return ocx.RemoveDrawGraph(mode)
	}

	/**
	 * 设置全屏
	 * @param {*} ocx 
	 * @param {*} isFull  true 表示全屏
	 */
	nvs.SetFullscreen = function (ocx, isFull) {
		return ocx.SetFullscreen(isFull)
	}
	
	/**
	 * 是否全屏
	 * @param {*} ocx 
	 * @returns true 表示全屏
	 */
	nvs.IsFullscreen = function (ocx) {
		return ocx.IsFullscreen()
	}
	
	/**
	 * 
	 * @param {*} ocx 
	 * @param {string} devID 	设备ID
	 * @param {long} tmBegin 	开始时间, unix EPOC时间, 秒级
	 * @param {long} tmEnd 		结束时间
	 * @param {int} place 		录像位置, 取值为 0
	 * @param {int} type 		录像类型, 暂无用
	 * @return 录像结果, 以JSON字符串形式
	 */
	nvs.QueryRecord = function (ocx, devID, tmBegin, tmEnd, place, type) {
		return ocx.QueryRecord(devID, tmBegin, tmEnd, place, type)
	}
	
	
	/**
	 * 获取所有目录节点, JSON字符串形式.
	 * @param {*} ocx 
	 */
	nvs.GetDepResList = function (ocx) {
		return ocx.GetDepResList()
	}
	
	
	/**
	 * 获取指定目录下摄像头, JSON字符串形式.
	 * @param {*} ocx 
	 */
	nvs.GetVideoResList = function (ocx, depId) {
		return ocx.GetVideoResList(depId)
	}
	
	/**
	 * 获取ocx版本号.
	 * @param {*} ocx 
	 */
	nvs.GetSoftVersion = function (ocx) {
		return ocx.GetSoftVersion()
	}
	
	
    window['nvs'] = nvs;
    
})();
